# 教程：https://dormousehole.readthedocs.io/en/latest/tutorial/layout.html
# 文件结构：
# /home/user/Projects/flask-tutorial
# ├── flaskr/
# │   ├── __init__.py
# │   ├── db.py
# │   ├── schema.sql
# │   ├── auth.py
# │   ├── blog.py
# │   ├── templates/
# │   │   ├── base.html
# │   │   ├── auth/
# │   │   │   ├── login.html
# │   │   │   └── register.html
# │   │   └── blog/
# │   │       ├── create.html
# │   │       ├── index.html
# │   │       └── update.html
# │   └── static/
# │       └── style.css
# ├── tests/
# │   ├── conftest.py
# │   ├── data.sql
# │   ├── test_factory.py
# │   ├── test_db.py
# │   ├── test_auth.py
# ├── .venv/
# ├── pyproject.toml
# └── MANIFEST.in

# 最简单粗暴的方式》》创建全局Flask实例
# 在函数内部创建Flask实例代替全局实例——这个函数即应用工厂。应用相关配置和其他设置都会在函数内部完成。
import os
from flask import Flask, render_template 
def create_app(test_config=None):
    app = Flask(__name__, instance_relative_config=True)  # __name__ 应用路径。实例文件夹的相对路径，本地数据位于包的外面。
    app.config.from_mapping(
        SECRET_KEY='dev',
        DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
    )

    if test_config is None:
        # load the instance config, if it exists, when not testing
        app.config.from_pyfile('config.py', silent=True)
    else:
        # load the test config if passed in
        app.config.from_mapping(test_config)
    # ensure the instance folder exists
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    # a simple page that says hello
    # @app.route('/')
    # def index():
    #     return render_template('index.html')

    from . import db
    db.init_app(app)

    from . import auth
    app.register_blueprint(auth.bp)

    from . import blog
    app.register_blueprint(blog.bp)
    app.add_url_rule('/', endpoint='index')

    return app